package result

// JSON 返回值实体 - 使用(Sync.Pool)临时对象池来初始化JSON返回值实体
// 这样API在设置返回值时，只需要从临时对象池中获取即可,使用完后再放回

import (
	"github.com/gin-gonic/gin"
	"sync"
)

var resultPool *sync.Pool

func init()  {
	resultPool = &sync.Pool{
		New: func() interface{} {
			return NewJsonResult("", 0, nil)
		},
	}
}

type JsonResult struct {
	Message string      `json:"message"`
	Code    ResCode     `json:"code"`
	Result    interface{} `json:"result"`
}

func NewJsonResult(message string, code ResCode, result interface{}) *JsonResult {
	return &JsonResult{Message: message, Code: code, Result: result}
}




//------------------------------------------------------------------------------------//

// 设置JSON返回值
type resultHandler func(message string, code ResCode, result interface{}) func(outPut)

// 返回值输出
type outPut func(ctx *gin.Context, result interface{})

// 设置返回值 与 返回值输出  分离
// API都通过此方法来设置JSON返回值
func Response(ctx *gin.Context) resultHandler {
	return func(message string, code ResCode, result interface{}) func(of outPut) {
		res := resultPool.Get().(*JsonResult)
		defer resultPool.Put(res)
		if message == "" { message = code.Msg() }
		res.Message = message
		res.Code = code
		res.Result = result

		// 返回值输出
		//ctx.JSON(200, res)
		return func(of outPut) {
			of(ctx, res)
		}
	}
}
